package xcity

import (
	"fmt"
	"strings"

	"gitee.com/xiaoyutab/xgotool"
	"gitee.com/xiaoyutab/xgotool/optional/xlog"
	"gitee.com/xiaoyutab/xgotool/xstring"
)

// 加载数据到数据库中
func insert_data() {
	xlog.Info("开始转换地址信息", nil)
	cont, err := CityCsv.ReadFile("city.csv")
	if err != nil {
		xlog.Panic("默认配置文件加载失败", err)
		return
	}
	// 转码
	inf := string(xstring.Charset(string(cont), "GBK", "UTF8"))
	count := int64(0)
	lis := strings.Split(inf, "\n")
	for i := 0; i < len(lis); i++ {
		lis[i] = strings.TrimSpace(lis[i])
		if i == 0 {
			// 第一行不进行计算
			continue
		}
		if lis[i] == "" {
			// 空白行不进行计算
			continue
		}
		count++
	}
	xlog.Info("地址转换完成，开始探测数据库内文件", nil)
	var db_count int64
	if err := _default.DB.Table(_default.CityName).Count(&db_count).Error; err != nil {
		xlog.Crit("城市信息获取错误", err)
		return
	}
	if db_count != count {
		// 数据库条数和查询到的条数不一致，查询数据库中的所有数据，重组不一致的列表，进行插入
		db_lis := []uint{}
		if err := _default.DB.Table(_default.CityName).Select("ad_code").Find(&db_lis).Error; err != nil {
			xlog.Crit("所有城市主键信息获取错误", err)
			return
		}
		new_lis := []City{}
		for i := 0; i < len(lis); i++ {
			if i == 0 {
				// 第一行不进行计算
				continue
			}
			if lis[i] == "" {
				// 空白行不进行计算
				continue
			}
			// 使用,分割字符串
			tmp := strings.Split(lis[i], ",")
			if len(tmp) < 3 {
				// 跳过数据不正确的行
				xlog.Error("CSV行展示错误", fmt.Errorf("行：%d,内容：%s", i+1, tmp))
				continue
			}
			if !xgotool.InArray(xstring.ToUint(tmp[1]), db_lis) {
				new_lis = append(new_lis, City{
					Adcode:   xstring.ToUint(tmp[1]),
					Name:     tmp[0],
					CityCode: tmp[2],
				})
			}
		}
		// 数据入库
		for i := 0; i < len(new_lis); i++ {
			if err := _default.DB.Table(_default.CityName).Create(&new_lis[i]).Error; err != nil {
				xlog.Error("城市插入错误", fmt.Errorf("城市名：%s,Code：%d", new_lis[i].Name, new_lis[i].Adcode))
				continue
			}
		}
	}
	xlog.Info("城市信息探测完成", nil)
}
